package com.atguigu.realtime.apps

import org.apache.spark.streaming.StreamingContext

/**
 * Created by Smexy on 2022/8/26
 *    抽取SparkStreaming App 运行的基类(基础类，父类)
 *
 *    不同的业务，在实现时，对流的batchDuration和Appname的要求是不同的，所以StreamingContext应该交给子类去实现！
 *
 *        业务一App：  appName = A , batchDuration = 3s
 *        业务二App：  appName = B , batchDuration = 5s
 *
 *    如果一个类上有抽象的属性，那么这个类必须得是抽象类。
 *    这个类只是提供子类需要的一般功能，本身实例化就没有意义，它是一个半成品。
 */
abstract class BaseApp {

  //交给子类继承时，来overwrite。在父类中不赋值的。
  //以下四个均为抽象属性
  var batchDuration:Int
  var appName:String
  var groupId:String
  var topic:String

  //在子类继承父类后，重写这个属性
  var context:StreamingContext = null

  /*
      code:{}=>Unit 等价于 code:()=>Unit    等价于 code:=>Unit(只能写这个)

      不同的业务App，只需要调用   runSparkStreamingApp(自己的业务代码) ，就可以直接跑
   */
  def runSparkStreamingApp(code: =>Unit):Unit={

    try {
      code

      context.start()

      context.awaitTermination()
    } catch {
      case  e:Exception=> {
        e.printStackTrace()
        throw new RuntimeException("运行出错了!")
      }
    }


  }

}
